<?php

namespace JLPay\Core;

/**
 * Demo配置工具类
 * 提供便捷的demo配置创建方法，用于简化demo示例代码
 */
class DemoConfig
{
    // =================== Demo密钥常量 =====================
    
    /**
     * Demo SM2公钥
     */
    const DEMO_SM2_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEJJhFmjeMRp9GwShxtWunv6Wny//m
Dg2pcnu0llDQvIYo5O3R+al39NekciZ0BIrT21Y/QJrXgJIoyBr6STml6g==
-----END PUBLIC KEY-----";

    /**
     * Demo SM2私钥
     */
    const DEMO_SM2_PRIVATE_KEY = "-----BEGIN EC PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgHqOp471SMDsQml2G
2ErpZPLD2X7rbMqa6P1O9Zqlhe+gCgYIKoEcz1UBgi2hRANCAAQkmEWaN4xGn0bB
KHG1a6e/pafL/+YODalye7SWUNC8hijk7dH5qXf016RyJnQEitPbVj9AmteAkijI
GvpJOaXq
-----END EC PRIVATE KEY-----";

    /**
     * Demo 嘉联支付平台公钥
     */
    const DEMO_JLPAY_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEA/////v//////////
//////////8AAAAA//////////8wRAQg/////v////////////////////8AAAAA
//////////wEICjp+p6dn140TVqeS89lCafzl4n1FauPkt28vUFNlA6TBEEEMsSu
LB8ZgRlfmQRGajnJlI/jC7/yZgvhcVpFiTNMdMe8Nzai9PZ3nFm9zuNraSFT0KmH
fMYqR0AC3zLlITnwoAIhAP////7///////////////9yA99rIcYFK1O79Ak51UEj
AgEBA0IABKZ3VWwH0Aw9xvOWXb+xM2gXyApWEAZLFy8UyIigp3ehOTwPJ693njrg
NavTLdzAtFBqXRreivlwBTIFy8iRgn8=
-----END PUBLIC KEY-----";

    // =================== Demo应用配置常量 =====================
    
    /**
     * Demo 应用ID
     */
    const DEMO_APP_ID = "1vzougr30f9vcw";
    
    /**
     * 生产环境API地址
     */
    const PROD_API_URL = "https://openapi.jlpay.com";
    
    /**
     * UAT测试环境API地址
     */
    const UAT_API_URL = "https://openapi-uat.jlpay.com";
    
    /**
     * 文件上传UAT测试环境API地址
     */
    const UAT_UPLOAD_API_URL = "https://upload-uat.jlpay.com";

    // =================== Demo配置创建方法 =====================
    
    /**
     * 创建加密配置对象（用于含有敏感字段的场景）
     * 
     * @param bool $isProd 是否为生产环境，默认false（UAT环境）
     * @param bool $autoEncrypt 是否自动加密，默认true
     * @param bool $autoDecrypt 是否自动解密，默认true
     * @param string $cryptoAlg 加密算法，默认"SM2WithSM4"
     * @return OrgConfig
     */
    public static function createConfigWithCrypto(
        bool $isProd = false,
        bool $autoEncrypt = true,
        bool $autoDecrypt = true,
        string $cryptoAlg = "SM2WithSM4"
    ): OrgConfig {
        $url = $isProd ? self::PROD_API_URL : self::UAT_API_URL;
        
        return OrgConfig::builder()
            ->appId(self::DEMO_APP_ID)
            ->url($url)
            ->orgPriKey(self::DEMO_SM2_PRIVATE_KEY)
            ->orgPubKey(self::DEMO_SM2_PUBLIC_KEY)
            ->jlpayPubKey(self::DEMO_JLPAY_PUBLIC_KEY)
            ->autoEncrypt($autoEncrypt)
            ->cryptoAlg($cryptoAlg)
            ->autoDecrypt($autoDecrypt)
            ->build();
    }
    
    /**
     * 创建标准demo配置对象（用于不含有敏感字段的场景）
     * 
     * @param bool $isProd 是否为生产环境，默认false（UAT环境）
     * @return OrgConfig
     */
    public static function createConfig(bool $isProd = false): OrgConfig {
        $url = $isProd ? self::PROD_API_URL : self::UAT_API_URL;
        
        return OrgConfig::builder()
            ->appId(self::DEMO_APP_ID)
            ->url($url)
            ->orgPriKey(self::DEMO_SM2_PRIVATE_KEY)
            ->orgPubKey(self::DEMO_SM2_PUBLIC_KEY)
            ->jlpayPubKey(self::DEMO_JLPAY_PUBLIC_KEY)
            ->build();
    }
    
    /**
     * 创建文件上传demo配置对象
     * 
     * @param bool $isProd 是否为生产环境，默认false（UAT环境）
     * @return OrgConfig
     */
    public static function createUploadConfig(bool $isProd = false): OrgConfig {
        $url = $isProd ? self::PROD_API_URL : self::UAT_UPLOAD_API_URL;
        
        return OrgConfig::builder()
            ->appId(self::DEMO_APP_ID)
            ->url($url)
            ->orgPriKey(self::DEMO_SM2_PRIVATE_KEY)
            ->orgPubKey(self::DEMO_SM2_PUBLIC_KEY)
            ->jlpayPubKey(self::DEMO_JLPAY_PUBLIC_KEY)
            ->build();
    }
    
    // =================== Demo工具方法 =====================
    
    /**
     * 获取demo应用ID
     * 
     * @return string
     */
    public static function getDemoAppId(): string {
        return self::DEMO_APP_ID;
    }
} 